<?php
/**
 * User: LRZ
 * Date: 2020/1/17
 * Time: 9:47
 */

/**
 *  914.卡牌分组
 *
 *  标签：数组、数学
 *
 *  给定一副牌，每张牌上都写着一个整数。
 *  此时，你需要选定一个数字 X，使我们可以将整副牌按下述规则分成 1 组或更多组：
 *  每组都有 X 张牌。
 *  组内所有的牌上都写着相同的整数。
 *  仅当你可选的 X >= 2 时返回 true。
 *
 *  示例 1：
 *      输入：[1,2,3,4,4,3,2,1]
 *      输出：true
 *      解释：可行的分组是 [1,1]，[2,2]，[3,3]，[4,4]
 *
 *  示例 2：
 *      输入：[1,1,1,2,2,2,3,3]
 *      输出：false
 *      解释：没有满足要求的分组。
 *
 *  示例 3：
 *      输入：[1]
 *      输出：false
 *      解释：没有满足要求的分组。
 *
 *  示例 4：
 *      输入：[1,1]
 *      输出：true
 *      解释：可行的分组是 [1,1]
 *
 *  示例 5：
 *      输入：[1,1,2,2,2,2]
 *      输出：true
 *      解释：可行的分组是 [1,1]，[2,2]，[2,2]
 *
 *  提示：
 *      1 <= deck.length <= 10000
 *      0 <= deck[i] < 10000
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$deck = [0,0,0,1,1,1,2,2,2];
$res  = hasGroupsSizeX($deck);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function hasGroupsSizeX($deck)
{
    $size = count($deck);
    sort($deck);

    if ($size < 2) {
        return false;
    }

    if ($deck[0] === $deck[$size - 1]) {
        return true;
    }

    for ($x = 2; $x <= $size / 2; $x++) {
        if ($size % $x !== 0) {
            continue;
        }
        $temp = $size / $x;
        $flag = 0;
        for ($i = 0; $i < $temp; $i++) {
            // 判断分组的第一个元素和最后一个元素是否一致
            if ($deck[$i * $x] !== $deck[$i * $x + $x - 1]) {
                break;
            }
            $flag++;
        }
        if ($flag === $temp) {
            return true;
        }
    }
    return false;
}